| Anterior | Próximo | Índice |
Os argumentos de uma rotina em Turbo Pascal são colocados pilha na ordem em que eles aparecem na declaração dos parâmetros formais: o primeiro, da esquerda para a direita, é colocado em primeiro lugar, seguido dos demais, até o último. Como cada argumento, no exemplo, ocupa 2 bytes na pilha, a rotina tem de retirar esses argumentos usando RET seguido pelo número de bytes colocados na pilha (no nosso exemplo, 6 bytes, que escrevemos como 2+2+2 para ilustrar melhor o método usado. A configuração da pilha em uma chamada deve ser essa:
SP = Valor Inicial de SP SP - 2 = Valor de SP após empilhar o primeiro parâmetro SP - 4 = Valor de SP após empilhar o segundo parâmetro SP - 6 = Valor de SP após empilhar o terceiro parâmetro SP - 8 = Valor de SP após a chamada da rotina empilhar o valor de IP SP - 10 = Valor de SP após a rotina empilhar o valor de BPLembre-se, BP é usado pelo 8086 para acessar um valor na pilha. Após mover para BP o último valor de SP, ou seja, SP Inicial menos 10, a pilha fica com essa configuração:
Endereço do primeiro parâmetro em relação a SS = [BP + 8] = [(SP - 10) + 8] = [SP - 2]
Endereço do segundo parâmetro em relação a SS= [BP + 6] = [(SP - 10) + 6] = [SP - 4]
Endereço do terceiro parâmetro em relação a SS = [BP + 4] = [(SP - 10) + 4] = [SP - 6]
;PROCP.ASM
;DEMONSTRACAO DE UMA ROTINA COM 3 PARAMETROS
;CHAMAR DE PROGRAMA EM TURBO PASCAL
;PARA MONTAR DIGITE: nasm -fobj procp.asm
segment CODE class=CODE align=1
;------------------------------------------------------
;function ParamDemo(x, y, z : integer):integer;external
;------------------------------------------------------
GLOBAL ParamDemo
ParamDemo:
PUSH BP
MOV BP,SP
PUSH DS
MOV AX, [BP + 8] ; AX := primeiro parametro
ADD AX, [BP + 6] ; soma AX com segundo parametro
ADD AX, [BP + 4] ; soma AX com terceiro parametro
;retorna resultado em AX
POP DS
POP BP
RET 2+2+2 ; retira os 3 parametros da pilha
{ Essa é a rotina em Turbo Pascal que chama a rotina assembly }
program ParametroDemo;
{$L procp}
function ParamDemo(x,y,z: integer): integer; external;
var total: integer;
BEGIN
total := ParamDemo(1,2,3);
writeln;
writeln('1+2+3 = ',total);
END.
|
| Anterior | Próximo | Índice |